package edu.cuit.avatar.generic;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;

/**
 * 泛型可以使我们在编译时而不是在运行时检测出错误
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/14 10:13
 */
public class GenericTest {
    public static void main(String[] args) throws Exception{
        Comparable<Date> date = new Date(); //多态

        Comparable<String> name = "peppa"; //多态

        //运行时异常 ClassCastException
        //System.out.println(date.compareTo(name)); //编译时检测出异常

//        ArrayList list = new ArrayList();
//        list.add("Peppa");
//        list.add(10);
//
//        //取数据
//        String element1 = (String) list.get(0); //需要类型强转
//        System.out.println(element1);
//        String element2 = (String) list.get(1); //ClassCastException

        ArrayList<String> list = new ArrayList<>();
        list.add("Peppa");


        String element = list.get(0);
        System.out.println(element);

        ArrayList<Integer> list2 = new ArrayList<>();
        //泛型信息在运行时是不可用的
        var clazz = list2.getClass();
        // 获取list2上的add方法
        var add = clazz.getDeclaredMethod("add", Object.class);
        // 使用反射调用add方法
        add.invoke(list2, "小猪Peppa"); //list2.add("小猪Peppa");
        add.invoke(list2, 20);

        System.out.println(list2);

        System.out.println(list instanceof ArrayList); //true
        System.out.println(list2 instanceof ArrayList); //true
        System.out.println(list.getClass() == list2.getClass()); //true
    }
}
